package com.project.sianet.fragment;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.*;
import android.widget.AdapterView.OnItemClickListener;

import com.project.sianet.MainActivity;
import com.project.sianet.R;
import com.project.sianet.data.MensajeArrayAdapter;
import com.project.sianet.data.Client.MensajeClient;
import com.project.sianet.data.HttpClient.MensajeHttpClient;
import com.project.sianet.entidades.Mensaje;
import com.project.sianet.entidades.enumerator.TipoMensaje;
import com.project.sianet.util.ConnectionDetector;
import com.project.sianet.util.SessionManager;
import com.project.sianet.util.extenders.SianetApplication;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpVersion;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpProtocolParams;
import org.apache.http.protocol.HTTP;

public class PlantillaMensajeFragment extends Fragment {

    private TipoMensaje tipoMensaje;
	private String lastRequestURI;
    private MensajeClient client;
//    SessionManager session;
    
    // Clase Connection detector
    ConnectionDetector cd;
    
    public PlantillaMensajeFragment(TipoMensaje tipoMensaje) {
    	
    	this.tipoMensaje = tipoMensaje;
    	
    }
    
//    public PlantillaMensajeFragment() {}
//    
//    public static final PlantillaMensajeFragment newInstance(TipoMensaje tipoMensaje) {
//    	PlantillaMensajeFragment f = new PlantillaMensajeFragment();
//    	Bundle args = new Bundle();
//    	args.putInt("tipMsje", tipoMensaje.ordinal());
//    	f.setArguments(args);
//    	return f;
//    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    	
    	// Creo la instancia de Connection detector
        cd = new ConnectionDetector(getActividad().getApplicationContext());
    	
//        tipoMensaje = TipoMensaje.values()[getArguments().getInt("tipMsje")];
        
    	if (container == null) {
	        return null;
	    }
    	
    	View view = inflater.inflate(R.layout.fragment_mensajes_lista, container, false);

    	new TareaWSObtenerMensajes(view).execute();
    	
        return view;
        
	}

	class TareaWSObtenerMensajes extends AsyncTask<String,Integer,List<Mensaje>> {
        private ProgressDialog progressDialog;
        
        View view;
        public TareaWSObtenerMensajes(View view) {
        	this.view = view;
        }
        
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            
            progressDialog = new ProgressDialog(getActividad());
            progressDialog.setCancelable(false);
            progressDialog.show();        
            progressDialog.setContentView(R.layout.custom_progressdialog);

        }

        @Override
		protected List<Mensaje> doInBackground(String... params) {

        	if (cd.hayConexionAInternet()) {
        	
        		try {
        			MensajeClient client = getMensajeClient();
        			
        			if (client != null) {
						if (tipoMensaje == TipoMensaje.Recibido)
							return client.getAllRecibidos(SessionManager.usuarioLogeado());
						else
							return client.getAllEnviados(SessionManager.usuarioLogeado());
        			} else
        				return null;
        			
        		} catch (Exception ex) {
        			return new ArrayList<Mensaje>();
        		}
			
        	} else
        		return null;
			
		}

        @Override
        protected void onPostExecute(List<Mensaje> msjes) {
			
			progressDialog.dismiss();
			
			if (msjes == null) {
				switchFragment(new NetworkLostFragment());
				return;
			}
			
			if (msjes.size() > 0) {
				
				MensajeArrayAdapter adapter = new  MensajeArrayAdapter(view.getContext(), R.layout.mensajes_list, msjes);
				ListView lv = (ListView) view.findViewById(R.id.lv_mensajes);
				lv.setAdapter(adapter);
				
				lv.setOnItemClickListener(new OnItemClickListener() {
					
		            @Override
		            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
		            	onSelectedMensajeItemClick(parent, view, position, id);
		            }
	            
				});
	            	
			} else {
	            	
//				AlertDialogManager.showToastMessage(getActividad(), "No hay mensajes registrados");
	            	
			}
			
		}
        
    }

	class TareaWSMarcarLeido extends AsyncTask<Integer,Void,Void> {
        
        int id;
        public TareaWSMarcarLeido(int id) {
        	this.id = id;
        }

        @Override
		protected Void doInBackground(Integer... params) {

        	if (!cd.hayConexionAInternet()) {
        		switchFragment(new NetworkLostFragment());
        		return null;
        	}
        	
			getMensajeClient().marcarLeido(Integer.toString(id), SessionManager.codigoIMEI());
			return null;
			
		}
        
    }
    
    private void onSelectedMensajeItemClick(AdapterView<?> parent, View view, int position, long id) { 
    	MensajeArrayAdapter arrayMsje = (MensajeArrayAdapter) parent.getAdapter();
    	Mensaje msje = arrayMsje.getItem(position);
    	
    	// Ejecuto el proceso que marca como leido el mensaje
    	// siempre y cuando no haya sido leido

    	if (!msje.getMailLeido() && (msje.getMailConCopia() != null && msje.getMailConCopia().contains(SessionManager.usuarioLogeado())))
    		new TareaWSMarcarLeido(msje.getMailCodigo()).execute();
    	
    	if (!msje.getMailLeido() && msje.getMailCodigoPara().equalsIgnoreCase(SessionManager.usuarioLogeado()))
    		new TareaWSMarcarLeido(msje.getMailCodigo()).execute();
    	
    	Fragment newContent = MensajesDetalleFragment.newInstance(msje, tipoMensaje);
    	switchFragment(newContent);
    	
    }
    
    private MensajeClient getMensajeClient() {
        
        String requestURI = SianetApplication.getRequestURI(getActividad());
		if (requestURI != null) {
	        if (client == null || !requestURI.equals(lastRequestURI)) {
	            BasicHttpParams params = new BasicHttpParams();
	            HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);
	            HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET);
	            HttpProtocolParams.setUseExpectContinue(params, false);
//	            client = ProxyFactory.create(MensajeClient.class, requestURI, new ApacheHttpClient4Executor(params));
	            client = new MensajeHttpClient(getActividad());
	            lastRequestURI = requestURI;
	        }
	        return client;
		} else
			return null;
		
	}
	
	private Activity getActividad(){
		return this.getActivity();
	}
    
    private void switchFragment(Fragment fragment) {
 		if (getActivity() == null)
 			return;
 		
 		if (getActivity() instanceof MainActivity) {
 			MainActivity ma = (MainActivity) getActivity();
 			ma.switchContent(fragment);
 		}
 	}
}
